package com.yjkf.zh.common.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectionUtils {

    /**
     *
     * @param object 要调用的对象（哪一个类）
     * @param method 要调用的方法名（类中的哪一个方法）
     * @param args  参数
     * @return
     */
    public static Object invoke(Object object,String method,Object... args){
        Object result = null;
        //加载类
        Class<? extends Object> clazz = object.getClass();
        //获取方法
        Method queryMethod = getMethod(clazz,method,args);
        if(queryMethod !=null){
            try {
                result = queryMethod.invoke(object, args);
            }catch (IllegalAccessException e){
                e.printStackTrace();
            }catch (IllegalArgumentException e){
                e.printStackTrace();
            }catch (InvocationTargetException e){
                e.printStackTrace();
            }
        }else{
            try {
                throw new NoSuchMethodException(clazz.getName() + "没有找到");
            }catch (NoSuchMethodException e){
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     *  反射分析类
     * @param clazz
     * @param name
     * @param args      参数实例数据
     * @return
     */
    public static Method getMethod(Class<? extends Object> clazz,Object name,Object[] args){
        Method queryMethod = null;
        Method[] methods = clazz.getMethods();      //getMethods(),该方法是获取本类以及父类或者父接口中所有的公共方法(public修饰符修饰的)
        for(Method method:methods){
            if(method.getName().equals(name)){
                Class<?>[] parameterTypes = method.getParameterTypes();         //getParameterTypes获取参数类型，返回一个数组，无则返回0
                if(parameterTypes.length == args.length){
                    boolean isSameMethod = true;
                    for(int i=0;i<parameterTypes.length;i++){           //遍历参数，如果参数长度为0，则返回空
                        Object arg = args[i];
                        if(arg == null){
                            arg = "";
                        }

                        if(!parameterTypes[i].equals(args[i].getClass())){          //参数不一致，条件不成立

                            isSameMethod = false;
                        }
                    }
                    if(isSameMethod){                   //条件成立
                        queryMethod = method;
                        break;
                    }
                }
            }
        }
        return queryMethod;
    }
}
